#ifndef CONVERTIDOR_H_
#define CONVERTIDOR_H_

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include "../DTO.h"
#include "../Constantes.h"

/**
 * Clase utilitaria que brinda funciones para el manejo de string
 *
 */
class UtilString {

public:
	/**
	 * Convierte un String a un Integer
	 */
	static int stringToInt(const std::string& valor);
	static bool stringToBool(const std::string& valor);
	static float stringToFloat(const std::string& valor);
	static unsigned int stringToUnsignedInt(const std::string& valor);


	static long int stringToLongInt(const std::string& valor);

	static int charToInt(char valor[]);

	static long int charToLongInt(char valor[]);
	/**
	 * Convierte un Integer a un string
	 */
	static std::string intToString(const int& valor);
	static std::string floatToString(const float& valor);
	static std::string longUnsignedIntToString(const long unsigned int & valor);
	static std::string unsignedIntToString(const unsigned int& valor);

	/**
	 * Convierte un Integer a un string manteniendo el tamañano de un int
	 */
	static std::string intToStringFixed(const unsigned long& valor,unsigned long int maxSize);
	/**
	 * Divide una string y lo devuelve
	 * en un vector
	 */
	static void splitWithSeparator(std::vector<std::string>* retorno,std::string& toSplit);
	static void splitWithSeparator(std::vector<std::string>* retorno, const std::string& toSplit,const char& separator);
	/**
	 * Dado un string busca un string de coincidencia y
	 * reemplaza por el parametro replaceWith.
	 * El string a parsear vuelve cambiado
	 */
	static void replaceWithString(std::string& stringToParse, std::map<std::string,std::string>& mapaReemplazo,char buscado, std::string valorDefault);
	/**
	 * Dado un vector, lo convierte en string separado por un separador
	 */
	static std::string convertirEnString(std::vector<std::string>* aConvertir,std::string separador);

	/*
	 * Dado un string y un delimitador, devuelve el substring que contiene los caracteres
	 * desde la posicion cero hasta la posicion del delimitador y remueve del string
	 * pasado por parametro el respectivo token junto con su delimitador.
	 */
	static std::string obtenerToken(std::string &cadena, unsigned long tam);

	/*
	 * Dado un string devuelve un char* al dato
	 */
	static char* copiarConstCharAChar(std::string origen);

	/**
	 * Busca los dos delimitadores en la cadena, devuelve el primer delimitador que encuentra.
	 * En caso de que no encuentre ninguno, devuelve un string vacio.
	 */
	static std::string encontrarDelimitadores(const std::string &cadena, const std::string &primerDelimitador,
									   const std::string &segundoDelimitador);

	static std::string FROMlenghtStringStringValue(std::string& stream);

	static std::string TOlenghtStringStringValue(std::string& stream);
	static std::string TOlenghtStringStringValue(int param);
	static std::string TOlenghtStringStringValue(float param);
	static std::string TOlenghtStringStringValue(unsigned int param);
	static std::string TOlenghtStringStringValue(long unsigned int param);

	static int pxSize(std::string& stream);
};

#endif /* CONVERTIDOR_H_ */
